package com.io.nio;

import cn.hutool.core.io.BufferUtil;
import cn.hutool.core.util.StrUtil;

import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;

/**
 * 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储，这部分预留的内存空间就叫做缓冲区：
 * <p>
 * 使用缓冲区有这么两个好处：
 * <p>
 * 1、减少实际的物理读写次数
 * <p>
 * 2、缓冲区在创建时就被分配内存，这块内存区域一直被重用，可以减少动态分配和回收内存的次数
 *
 * @author xin.ding
 * @date 2021/3/5 9:39
 */
public class ByteBufferTest {

    public static void main(String args[]) throws FileNotFoundException {

        final ByteBuffer buffer1 = BufferUtil.createUtf8("Hello 世界");
//        System.out.println(buffer1);
        System.out.println(BufferUtil.readLine(buffer1, Charset.defaultCharset()));


//        System.out.println("----------Test allocate--------");
//        System.out.println("before alocate:"
//                + Runtime.getRuntime().freeMemory());
//
//        // 如果分配的内存过小，调用Runtime.getRuntime().freeMemory()大小不会变化？
//        // 要超过多少内存大小JVM才能感觉到？
//        ByteBuffer buffer = ByteBuffer.allocate(102400);
//        System.out.println("buffer = " + buffer);
//
//        System.out.println("after alocate:"
//                + Runtime.getRuntime().freeMemory());
//
//        // 这部分直接用的系统内存，所以对JVM的内存没有影响
//        ByteBuffer directBuffer = ByteBuffer.allocateDirect(102400);
//        System.out.println("directBuffer = " + directBuffer);
//        System.out.println("after direct alocate:"
//                + Runtime.getRuntime().freeMemory());
//
//        System.out.println("----------Test wrap--------");
//        byte[] bytes = new byte[32];
//        buffer = ByteBuffer.wrap(bytes);
//        System.out.println(buffer);
//
//        buffer = ByteBuffer.wrap(bytes, 10, 10);
//        System.out.println(buffer);
    }
}
